﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
using personalplaner.business.enums;
using personalplaner.business.stamm;
using personalplaner.common.mvvm;
using personalplaner.common.mvvm.commands;
using personalplaner.common.mvvm.common;
using personalplaner.servicemodel.common;

namespace personalplaner.gui.stamm.viewmodels.models
{
	public class DienstZeitWizardZeitModel : BaseModel
	{

		#region Commands

		ICommand _deleteTimeCommand;
		public ICommand DeleteTimeCommand
		{
			get
			{
				if (_deleteTimeCommand == null)
					_deleteTimeCommand = new RelayCommand<DienstZeitEinheit>(OnDeleteTime);
				return _deleteTimeCommand;
			}
		}

		private void OnDeleteTime(DienstZeitEinheit param)
		{
			if (param != null && Zeiten.Contains(param))
				Zeiten.Remove(param);
		}

		ICommand _addtimecommand;
		public ICommand AddTimeCommand
		{
			get
			{
				if (_addtimecommand == null)
					_addtimecommand = new RelayCommand(OnAddTime);
				return _addtimecommand;
			}
		}

		private void OnAddTime(object parameter)
		{
			if (Von == "00:00" && Bis == "00:00")
			{
				MessageBox.Show("Es ist keine gültige Zeit angegeben.", "", MessageBoxButton.OK, MessageBoxImage.Asterisk);
				RaiseMoveFocus("Von");
				return;
			}

			int hvon = int.Parse(Von.Substring(0, 2));
			int mvon = int.Parse(Von.Substring(3, 2));
			int hbis = int.Parse(Bis.Substring(0, 2));
			int mbis = int.Parse(Bis.Substring(3, 2));
			if (hvon > hbis ||
				(hvon == hbis && mvon >= mbis))
			{
				MessageBox.Show("Zeit-von ist grösser als Zeit-bis.\nBitte setzen Sie die Zeit-bis grösser als die Zeit-von.", "", MessageBoxButton.OK, MessageBoxImage.Asterisk);
				RaiseMoveFocus("Von");
				return;
			}

			Zeiten.Add(new DienstZeitEinheit
			{
				Von = Von,
				Bis = Bis,
				ZeitTyp = SelectedZeitTyp
			});

			Von = "07:00";
			Bis = "18:00";
			SelectedZeitTyp = enZeiteinheit.Arbeit;
		}

		#endregion

		#region Properties

		string _von;
		public string Von
		{
			get { return _von; }
			set
			{
				_von = value;
				RaisePropertyChanged("Von");
                SetTimeTotal();
			}
		}

		string _bis;
		public string Bis
		{
			get { return _bis; }
			set
			{
				_bis = value;
				RaisePropertyChanged("Bis");
                SetTimeTotal();
			}
		}

        double _zeit;
        public double Zeit
        {
            get
            {
                return _zeit;
            }
            set
            {
                _zeit = value;
                RaisePropertyChanged("Zeit");
                SetTimeVonBis();
            }
        }

		enZeiteinheit _zeitTyp;
		public enZeiteinheit SelectedZeitTyp
		{
			get { return _zeitTyp; }
			set
			{
				_zeitTyp = value;
				RaisePropertyChanged("SelectedZeitTyp");
			}
		}

		IList<enZeiteinheit> _zeitTypen;
		public IList<enZeiteinheit> ZeitTypen
		{
			get
			{
				if (_zeitTypen == null)
				{
					_zeitTypen = new List<enZeiteinheit>
					             {
					             	enZeiteinheit.Arbeit,
					             	enZeiteinheit.Pause
					             };
				}
				return _zeitTypen;
			}
		}

		ObservableCollection<DienstZeitEinheit> _zeiten;
		public ObservableCollection<DienstZeitEinheit> Zeiten
		{
			get
			{
				if (_zeiten == null)
					_zeiten = new ObservableCollection<DienstZeitEinheit>();
				return _zeiten;
			}
		}

		#endregion

        #region Implementation

        bool _settingTotal;
        bool _settingVonBis;
        private void SetTimeTotal()
        {
            if (_settingVonBis)
                return;

            _settingTotal = true;

            try
            {
                if (string.IsNullOrEmpty(Von) || string.IsNullOrEmpty(Bis))
                {
                    Zeit = 0.0;
                    _settingTotal = false;
                    return;
                }

                int hVon;
                int mVon;
                int hBis;
                int mBis;

                var arrVon = Von.Split(':');
                if (arrVon.Length < 2)
                {
                    Zeit = 0.0;
                    _settingTotal = false;
                    return;
                }

                int.TryParse(arrVon[0], out hVon);
                int.TryParse(arrVon[1], out mVon);

                var arrBis = Bis.Split(':');
                if (arrBis.Length < 2)
                {
                    Zeit = 0.0;
                    _settingTotal = false;
                    return;
                }

                int.TryParse(arrBis[0], out hBis);
                int.TryParse(arrBis[1], out mBis);

                double von = ((double)hVon) + ((double)mVon / 60);
                double bis = ((double)hBis) + ((double)mBis / 60);

                if (von < bis)
                    Zeit = Math.Round(bis - von, 2);
                else
                    Zeit = Math.Round(von - bis, 2);

            }
            catch (Exception e)
            {
                ServiceLocator.GetGlobalService<IErrorLoger>().LoggMessage(enMessageType.ERROR, "Setting the time in DienstZeitWisardZeitModel.SetTimeTotal cased an error");
                ServiceLocator.GetGlobalService<IErrorLoger>().ToXML("Setting the time cased an error", "DienstZeitWisardZeitModel.SetTimeTotal", e.Message);
            }

            _settingTotal = false;
        }

        private void SetTimeVonBis()
        {
            if (_settingTotal)
                return;

            _settingVonBis = true;

            try
            {
                if (Zeit <= 0)
                    return;

                Von = "07:00";

                int full = (int)Zeit;
                double tmp = Zeit - (double)full;
                full += 7;

                string hour = full.ToString();
                if (full < 10)
                    hour = string.Format("0{0}", full);
                tmp = tmp * 60;
                string minute = ((int)tmp).ToString();
                if (tmp < 10)
                    minute = string.Format("0{0}", (int)tmp);

                Bis = string.Format("{0}:{1}", hour, minute);
            }
            catch (Exception e) 
            {
                ServiceLocator.GetGlobalService<IErrorLoger>().LoggMessage(enMessageType.ERROR, "Setting the time in DienstZeitWisardZeitModel.SetTimeVonBis cased an error");
                ServiceLocator.GetGlobalService<IErrorLoger>().ToXML("Setting the time cased an error", "DienstZeitWisardZeitModel.SetTimeVonBis", e.Message);
            }

            _settingVonBis = false;
        }

        #endregion
    }
}
